/**
 * @param {number} n
 * @return {number}
 */
var nthUglyNumber = function (n) {
  // 使用数组模拟最小堆
  const heap = [1];
  // 使用 Set 去重
  const seen = new Set([1]);

  let ans = 0;
  for (let i = 0; i < n; i++) {
    // 取出堆中最小的数（即数组的第一个元素）
    ans = heap.shift();
    // 生成新的丑数并插入堆中
    for (const factor of [2, 3, 5]) {
      const newUgly = ans * factor;
      if (!seen.has(newUgly)) {
        seen.add(newUgly);
        heap.push(newUgly);
        // 每次插入后重新排序，模拟最小堆的行为
        heap.sort((a, b) => a - b);
      }
    }
  }
  return ans;
};
